// G4定义的头文件
#include "G4RunManager.hh"
#include "G4LogicalVolume.hh"
#include "G4Step.hh"
#include "G4Event.hh"

// 用户编写的头文件
#include "G4ExtensionSteppingAction.hh"
#include "G4ExtensionDetectorConstruction.hh"
#include "G4ExtensionEventAction.hh"

// 构造函数，参数为eventAction
G4ExtensionSteppingAction::G4ExtensionSteppingAction(G4ExtensionEventAction* eventAction)  
: fEventAction(eventAction){}

// 析构函数
G4ExtensionSteppingAction::~G4ExtensionSteppingAction(){}

// 每个step结束后运行此函数
void G4ExtensionSteppingAction::UserSteppingAction(const G4Step* step){

    if(!fScoringVolume){

        // 从G4ExtensionDetectorConstruction获取建立的模型
        const G4ExtensionDetectorConstruction* detConstruction = 
            static_cast<const G4ExtensionDetectorConstruction*>
            (G4RunManager::GetRunManager()->GetUserDetectorConstruction());

        // 从用户建立的模型中获取设置的敏感体积
        fScoringVolume = detConstruction->GetScoringVolume();
    }
    // 获取当前步骤所在的位置
    G4LogicalVolume* volume = step->GetPreStepPoint()->GetTouchableHandle()->GetVolume()->GetLogicalVolume();

    // 检查是否在感兴趣区，不在就返回，不再执行后续能量沉积累加的步骤
    if(volume != fScoringVolume) return;

    // 获取当前step获得了多少能量
    G4double edepStep = step->GetTotalEnergyDeposit();

    // 将获得的能量传递到fEventAction
    fEventAction->AddEdep(edepStep);

}

